home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DRIVES.SWG / 0092_CD-ROM Disksize.pas < prev    next >
Pascal/Delphi Source File  |  1995-02-28  |  4KB  |  132 lines

  1.  
  2. {
  3.  KB> How do get the disk size or the total clusters on a CD-ROM?
  4. }
  5.  
  6.  program CD_Info;
  7.  
  8.  uses crt, dos;
  9.  
  10.  Type   tReq_Blk = Array[0..255] of Byte;
  11.         tReq_Hdr = Array[0..017] of Word;
  12.  
  13.  Const  MSCDEX_GETDRIVES  = $1500;
  14.         MSCDEX_GETVERSION = $150C;
  15.         MSCDEX_DRIVER_REQ = $1510;
  16.  
  17.         MSCDEX_GetSecSize = 7;
  18.         MSCDEX_GetVolSize = 8;
  19.  
  20.         RAW_DATA          = 1;
  21.  
  22.  Var    CPU             : Registers;
  23.         Akt, Cnt, First : byte;
  24.         Req_Hdr         : tReq_Hdr;
  25.         Req_Blk         : tReq_Blk;
  26.         SecSize         : word;
  27.         VolBytes        : real;
  28.         VolSize         : LongInt;
  29.  
  30.  function CallDriver( Var R: Registers ):byte;
  31.  begin
  32.    Intr($2F, R);
  33.    if (R.FLAGS and FCARRY) <> 0
  34.      then CallDriver := R.AL
  35.      else CallDriver := 0;
  36.  end;
  37.  
  38.  
  39.  
  40.  begin
  41.    writeln; writeln;
  42.    writeln(' CD-ROM Info v1.0           (c)  Norbert Igl 1994 ');
  43.    writeln;
  44.    With CPU do
  45.    begin
  46.      FillChar( CPU, Sizeof( CPU ), 0);
  47.      AX := MSCDEX_GETVERSION;
  48.      If CallDriver( CPU ) <> 0 then
  49.      begin
  50.        writeln(' MSCDEX not installed ... ');
  51.        halt(1);
  52.      end
  53.      else begin
  54.        writeln(' MSCDEX Version   : ',Hi(BX),'.',Lo(BX):2 );
  55.      end;
  56.  
  57.      FillChar( CPU, Sizeof( CPU ), 0);
  58.      AX := MSCDEX_GETDRIVES;
  59.      If CallDriver( CPU ) <> 0 then
  60.      begin
  61.        writeln(' GETDRIVES Error  : ',Lo(AX) );
  62.        halt(2);
  63.      end
  64.      else begin
  65.        Cnt   := BX;
  66.        First := CX;
  67.        write(' Installed Drives : ',Cnt,' ( ');
  68.        write( CHAR( 65+first ),':');
  69.        if Cnt > 1 then
  70.          write(' .. ', CHAR( 64+first+cnt),':');
  71.        writeln(' )');
  72.      end;
  73.      For Akt := First to First+Cnt-1 do
  74.      begin
  75.        FillChar( CPU, Sizeof( CPU ), 0);
  76.        FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
  77.        FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);
  78.  
  79.        Req_Hdr[0] := $000D;  { length of req_hdr }
  80.        Req_Hdr[1] := $0003;  { IOCTL_READ }
  81.        Req_Hdr[7] := Ofs(Req_Blk);
  82.        Req_Hdr[8] := Seg(Req_Blk);
  83.        Req_Hdr[9] := $0004;
  84.  
  85.        Req_Blk[0] := MSCDEX_GetSecSize;
  86.  
  87.        AX := MSCDEX_DRIVER_REQ;
  88.        CX := Akt;
  89.        ES := SEG( Req_Hdr );
  90.        BX := OFS( Req_Hdr );
  91.        If CallDriver( CPU ) <> 0 then
  92.        begin
  93.          writeln(' GetSecSize Drive(',Char(Akt+65),') Error  : ',Lo(AX) );
  94.        end
  95.        else Move(Req_Blk[2], SecSize, 2);
  96.  
  97.        FillChar( CPU, Sizeof( CPU ), 0);
  98.        FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
  99.        FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);
  100.  
  101.        Req_Hdr[0] := $000D;  { length of req_hdr }
  102.        Req_Hdr[1] := $0003;  { IOCTL_READ }
  103.        Req_Hdr[7] := Ofs(Req_Blk);
  104.        Req_Hdr[8] := Seg(Req_Blk);
  105.        Req_Hdr[9] := $0005;
  106.  
  107.        Req_Blk[0] := MSCDEX_GetVolSize;;
  108.  
  109.        AX := MSCDEX_DRIVER_REQ;
  110.        CX := Akt;
  111.        ES := SEG( Req_Hdr );
  112.        BX := OFS( Req_Hdr );
  113.        If CallDriver( CPU ) <> 0 then
  114.        begin
  115.          writeln(' GetVolSize Drive(',Char(Akt+65),') Error  : ',Lo(AX) );
  116.        end
  117.        else Move(Req_Blk[1], VolSize, 4);
  118.  
  119.        VolBytes := VolSize;
  120.        if VolBytes < 0 then
  121.        begin
  122.          VolSize :=  ( VolSize shr 1 );
  123.          VolBytes := Volsize;
  124.          VolBytes := VolBytes*2;
  125.        end;
  126.        VolBytes := Volbytes * SecSize;
  127.        VolBytes := Volbytes / ( 1024*1024 );
  128.        Writeln(' Disk in Drive ',Char(Akt+65),'  : ',VolBytes:6:2 ,' MB ');
  129.      end;
  130.    end
  131.  end.
  132.